package cn.hh.ymcc.service.impl;

import cn.hh.ymcc.domain.CourseMarket;
import cn.hh.ymcc.domain.CourseUserLearn;
import cn.hh.ymcc.dto.PyaResultDto;
import cn.hh.ymcc.mapper.CourseUserLearnMapper;
import cn.hh.ymcc.service.ICourseMarketService;
import cn.hh.ymcc.service.ICourseUserLearnService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author huang.hao
 * @since 2025-04-24
 */
@Service
public class CourseUserLearnServiceImpl extends ServiceImpl<CourseUserLearnMapper, CourseUserLearn> implements ICourseUserLearnService {

    @Autowired
    private ICourseMarketService courseMarketService;

    /**
     * 保存用户购买课程记录
     * 一个人loginId 可以一个课程多次 courseId
     * 我们需要通过校验表单是否存在过购买记录
     * 如果存在追加可观看数据,覆盖最佳的订单号
     * 如果没有,直接新增时间即可
     *
     * @param orderDto
     */
    @Override
    public void payResultHandle(PyaResultDto orderDto) {
        // 获取订单号
        String orderNo = orderDto.getOrderNo();
        // 获取到扩展参数 loginId + courseIds
        String extParams = orderDto.getExtParams();
        // 将JSON格式的extParams转换为Map
        Map<String, Object> map = JSON.parseObject(extParams, Map.class);
        // 获取到map里面的 用户id 强转为Long类型
        Long loginId = Long.valueOf(map.get("loginId").toString());
        // 在获取到map里面的courseIds 强转为String类型
        String courseIds = map.get("courseIds").toString();
        // 将字符串类型的courseIds,使用,分割
        String[] ids = courseIds.split(",");
        // 1.查询是否有过购买记录
        Wrapper<CourseUserLearn> wrapper = new EntityWrapper<>();
        Date endTime = null; // 课程结束时间
        Date now = new Date(); // 课程开始时间
        // 遍历ids
        for (String courseId : ids) {
            wrapper.eq("course_id", courseId);
            // 查询到CourseUserLearn表中的用户id,获取到CourseUserLearn对象
            CourseUserLearn userLearn = selectOne(wrapper);
            // 注入courseMarket查询courseId,获取到CourseMarket对象  要用courseMarket对象添加购买课程的有效时长
            CourseMarket courseMarket = courseMarketService.selectById(courseId);
            // 判断用户是否已经购买过课程
            if (userLearn != null) {
                // 判断课程开始时间小于用户课程过期时间: 说明,用户购买的课程过期了
                if (now.before(userLearn.getEndTime())) {
                    endTime = DateUtils.addDays(userLearn.getEndTime(), courseMarket.getValidDays()); // 结束时间 = userLearn对象的结束时间,加上courseMarket的课程有效时长 31天
                } else { // 如果课程没有过期,则重新设置课程开始时间
                    userLearn.setStartTime(now); // 设置课程开始时间
                }
                // 最后购买过课程,追加可观看时长,覆盖订单号
                userLearn.setEndTime(endTime); // 设置课程结束的时长 [追加有效时长]
                userLearn.setCourseOrderNo(orderNo); // 覆盖订单号
                updateById(userLearn);  // 修改已有记录
            }
            else {   // 用户没有购买过课程, 保存购买数据
                userLearn = new CourseUserLearn();
                userLearn.setLoginId(loginId); // 设置用户id
                userLearn.setStartTime(now); // 设置课程开始时间
                userLearn.setEndTime(endTime); // 设置结束时间
                userLearn.setCourseId(Long.valueOf(courseId)); // 设置课程Id
                userLearn.setCourseOrderNo(orderNo); // 设置订单号
                userLearn.setCreateTime(now); // 设置创建时间
                insert(userLearn); // 保存用户购买记录
            }

        }
    }


}
